package com.carbon.carbonmanager.mapper;

import com.carbon.carbonmanager.model.EnterpressInfo;
import com.carbon.carbonmanager.model.TradeOrderInfo;
import com.carbon.carbonmanager.model.TradeRecodeInfo;
import com.carbon.carbonmanager.model.UserInfo;
import com.carbon.carbonmanager.unit.Pager;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 碳交易方法接口
 * */
@Mapper
@Component
public interface TradeMapper {
    /**
     * 发布交易（包括购买和售卖）
     * @return error = 0则执行成功
     * */
    public Integer publishTradeOrder(TradeOrderInfo tradeOrderInfo);

    /**
     * 发布交易 售卖订单
     * @return error = 0则执行成功
     * */
    public Integer publishTradeOrderSeller(TradeOrderInfo tradeOrderInfo);

    /**
     * 管理自己的碳信用资产
     * 根据发布人id获取自身订单列表数据，带分页
     * */
    public List<TradeOrderInfo> getTradeOrderListByPublishId(Pager pager);

    /**
     * 管理自己的碳信用资产
     * 根据发布人id获取自身订单数据列表总条数用于计算总页码
     * */
    public Integer getTradeOrderListTotalCountsByPublishId(Pager pager);

    /**
     * 确认发布订单
     * */
    public Integer applyTradeOrder(TradeOrderInfo tradeOrderInfo);

    /**
     * 确认撤销订单
     * */
    public Integer cancelTradeOrder(TradeOrderInfo tradeOrderInfo);

    /**
     * 修改订单之前验证该订单是否属于该用户，以避免越权操作
     * 验证订单是否已经完成交易状态，完成的订单不能撤销
     * */
    public TradeOrderInfo validateTradeOrderIsCurrentUser(TradeOrderInfo tradeOrderInfo);


    /**************************************************************************************
     * 交易市场信息列表分页数据1
     *
     * */
    public List<TradeOrderInfo> getTradeMarketDataByPager(Pager pager);

    /**
     * 交易市场信息列表分页数据2
     * 获取交易市场数据总数用于计算页码
     * */
    public Integer getTradeMarketDataTotalCounts(Pager pager);

    /**
     * 交易市场：交易买入
     * @return error ==0
     * */
    public Integer tradeBuyOrder(TradeOrderInfo tradeOrderInfo);

    /**
     * 交易市场：交易卖出
     * @return error ==0
     * */
    public Integer tradeSellOrder(TradeOrderInfo tradeOrderInfo);

    /**
     * 根据用户id查询企业信息
     * 取可用交易量和交易余额
     * */
    public EnterpressInfo getEnterInfoByTradeUserId(TradeOrderInfo tradeOrderInfo);

    /*******************************************************
     * 根据用户id获取其自身购买或者售卖的日志信息1
     * 即可以是购买者也可以是售卖者
     * */
    public List<TradeRecodeInfo> getTradeRecordMapperDataByCurrentUser(Pager pager);

    /**
     * 根据用户id获取其自身购买或者售卖的日志信息2
     * 获取日志总数
     * */
    public Integer getTradeRecordMapperDataCountsByCurrentUser(Pager pager);
}
